
#ifndef VANTIDEL_CPP_OBJHEADER_H
#define VANTIDEL_CPP_OBJHEADER_H

#include "utils.h"

typedef enum {
/* Class 类型 */
    OT_CLASS,
/* Object 类型 */
    OT_LIST,    // List 列表
    OT_MAP,     // Map 散列数组
    OT_MODULE,  // Module 模块作用域
    OT_RANGE,   // Range 数字范围
    OT_STRING,  // String 字符串
    OT_UPVALUE, // Upvalue 上值(上层闭包的值)
    OT_FUNCTION,// Function 函数
    OT_CLOSURE, // Closure 闭包
    OT_INSTANCE,// Instance 实例
    OT_THREAD   // Thread 线程
} ObjType;// 对象类型

class ObjHeader {
public:
    ObjType type;      // 对象类型
    bool isDark;       // 对象是否可达
    Class *objClass;   // 对象所属的类
    ObjHeader *next;   // 用于链接所有已分配对象

    ObjHeader(VM *vm, ObjType objType, Class *objClass);

    ObjHeader();

    static void InitObjHeader(VM *vm, ObjHeader *objHeader, ObjType objType, Class *objClass);
};// 对象头结构

typedef enum {
    VT_UNDEFINED,   // 未定义
    VT_NULL,        // Null
    VT_FALSE,       // False
    VT_TRUE,        // True
    VT_NUM,         // Num
    VT_OBJ          //值为对象,指向对象头
} ValueType;// Value的类型

typedef struct {
    ValueType type;
    union {
        double num;
        ObjHeader *objHeader;
    };
} Value;   //通用的值结构

DECLARE_BUFFER_TYPE(Value)

#endif //VANTIDEL_CPP_OBJHEADER_H
